// 导入所需的存储模块
import { useDeviceStore, usePreferenceStore } from '$/store'

// 导入工具函数和自适应消息提示函数
import { allSettledWrapper } from '$/utils/index.js'
import { adaptiveMessage } from '$/utils/modal/index.js'

// 导入 Element Plus 的消息提示组件
import { ElMessage } from 'element-plus'

/**
 * 截屏操作的钩子函数
 * @param {Object} params - 函数参数对象
 * @param {boolean} params.floating - 是否为浮动窗口模式
 */
export function useScreenshotAction({ floating } = {}) {
  // 获取设备和用户偏好设置的存储实例
  const deviceStore = useDeviceStore()
  const preferenceStore = usePreferenceStore()

  // 定义一个响应式的 loading 状态
  const loading = ref(false)

  /**
   * 根据传入的设备参数类型，调用对应的截屏处理函数
   * @param {Array|Object} devices - 设备对象或设备数组
   * @returns {Promise<boolean>|Promise<undefined>} - 根据设备参数类型返回不同的结果
   */
  function invoke(...args) {
    const [devices] = args

    // 判断传入的是单个设备还是多个设备
    if (Array.isArray(devices)) {
      return multipleInvoke(...args)
    }

    return singleInvoke(...args)
  }

  /**
   * 单个设备截屏操作
   * @param {Object} device - 设备对象
   * @param {Object} params - 附加参数对象
   * @param {boolean} params.silent - 是否静默模式，不显示加载和提示信息
   * @returns {Promise<boolean>} - 返回一个布尔值表示操作是否成功
   */
  async function singleInvoke(device, { silent = false } = {}) {
    let closeLoading

    // 如果不是静默模式且不是浮动窗口模式，则显示加载中提示
    if (!silent && !floating) {
      closeLoading = ElMessage.loading(
        window.t('device.control.capture.progress', {
          deviceName: deviceStore.getLabel(device),
        }),
      ).close
    }

    // 生成截屏文件名
    const fileName = deviceStore.getLabel(
      device,
      ({ time }) => `screenshot-${time}.jpg`,
    )

    // 获取设备的配置信息，并计算截屏保存路径
    const deviceConfig = preferenceStore.getData(device.id)
    const savePath = window.nodePath.resolve(deviceConfig.savePath, fileName)

    try {
      // 调用 ADB 工具进行截屏操作
      await window.adbkit.screencap(device.id, { savePath })
    }
    catch (error) {
      // 如果发生错误，显示警告信息，并返回 false
      if (error.message) {
        ElMessage.warning(error.message)
      }
      return false
    }

    // 如果是静默模式，直接返回 true
    if (silent) {
      return true
    }

    // 关闭加载中提示
    closeLoading?.()

    // 显示成功信息
    const successMessage = `${window.t(
      'device.control.capture.success.message.title',
    )}: ${savePath}`

    adaptiveMessage(successMessage, { type: 'success', system: floating })
  }

  /**
   * 多个设备截屏操作
   * @param {Array} devices - 设备数组
   * @returns {Promise<void>} - 无返回值
   */
  async function multipleInvoke(devices) {
    // 设置 loading 状态为 true
    loading.value = true

    // 显示加载中提示
    const closeMessage = ElMessage.loading(
      window.t('device.control.capture.progress', {
        deviceName: window.t('common.device'),
      }),
    ).close

    // 并发处理所有设备的截屏操作
    await allSettledWrapper(devices, (item) => {
      return singleInvoke(item, { silent: true })
    })

    // 关闭加载中提示
    closeMessage()

    // 显示批量操作成功的提示信息
    ElMessage.success(window.t('common.success.batch'))

    // 重置 loading 状态为 false
    loading.value = false
  }

  // 返回截屏操作的相关函数和 loading 状态
  return {
    invoke,
    loading,
    singleInvoke,
    multipleInvoke,
  }
}

// 默认导出该钩子函数
export default useScreenshotAction
